[프로그래머스] 짝지어 제거하기

https://programmers.co.kr/learn/courses/30/lessons/12973

문제

짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.

예를 들어, 문자열 S = baabaa 라면

b aa baa → bb aa → aa →

의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.

풀이

큐와 스택을 사용해서 풀 수 있는 문제였다. 원래 이런 문제를 풀 때 문자열 처리 때문에 힙겹게 풀었었는데, 몇 번의 코딩테스트를 거치면서 큐나 스택을 사용하는 노하우가 조금이나마 생긴 것 같다.

풀이는 이렇다.

  1. 문자열의 각 문자를 큐에 넣어두고, 비어 있는 결과 문자열을 하나 만든다.
  2. 큐에서 문자를 하나씩 꺼내면서 결과 문자열의 가장 마지막에 있는 문자와 같다면 결과 문자열의 마지막 문자를 삭제한다.
  3. 큐가 빌 때까지 2번 작업을 진행하고, 큐가 비게 되면 종료한다.
  4. 종료되었을 때, 결과 문자열에 문자가 하나라도 남아있다면 짝이 안맞으므로 0을 반환하고, 비어있다면 모두 짝지어져서 제거 되었으므로 1을 반환한다.

코드

#include <iostream>
#include <string>
#include <queue>

using namespace std;

int solution(string s)
{
    queue<char> q;

    for (char c : s){
        q.push(c);
    }

    string parsedString = "";

    while(!q.empty()){
        char now = q.front();
        if (!parsedString.empty() && parsedString.back() == now){
            parsedString.pop_back();
        }
        else {
            parsedString.push_back(now);
        }
        q.pop();
    }

    return parsedString.empty() ? 1 : 0;
}

Written by@전여훈 (Click Me!)
고민이 담긴 코드를 만들자, 고민하기 위해 공부하자.